//
// Created by tang on 2022/5/15.
//

#ifndef DIARYTOOL_DATE_UTILS_HPP
#define DIARYTOOL_DATE_UTILS_HPP

#include "config.h"

#include <string>

/**
 * 获取今天的日期，格式位 YYYY-MM-DD
 * @return 今天的日期
 */
DIARY_APP_SDK_API
std::string GetToday();

/**
 * 获取昨天的日期，格式位 YYYY-MM-DD
 * @return 昨天的日期
 */
DIARY_APP_SDK_API
std::string GetYesterday();

/**
 * 获取明天的日期，格式位 YYYY-MM-DD
 * @return 明天的日期
 */
DIARY_APP_SDK_API
std::string GetTomorrow();

/**
 * 从年月日查询星期数，返回周一至周日其中一个，失败时返回 "N/A"
 * @param year 年
 * @param month 月
 * @param day 日
 * @return 周一至周日其中一个 或者 "N/A"
 */
DIARY_APP_SDK_API
const char* ymd2week(const std::string& year, const std::string& month, const std::string& day);

/**
 * 从年月日查询星期数，返回周一至周日其中一个，失败时返回 "N/A"
 * @param date 年-月-日 字符串
 * @return 周一至周日其中一个 或者 "N/A"
 */
DIARY_APP_SDK_API
const char* date2week(const std::string& date);

/**
 * @brief 日期补全，最大限度的补全日期，返回第一天和最后一天
 * 
 * @param prefix 前缀，通常是年份 或者 年份加月份
 * @param first_day 第一天
 * @param last_day  最后一天
 */
DIARY_APP_SDK_API
void DateComplition(const std::string &prefix, std::string &first_day, std::string &last_day);


enum class Granularity {
    Year,
    Quarter,
    Month,
    Week,
};

enum class AdjustType {
    Previous,
    Current,
    Next,
};

DIARY_APP_SDK_API
void AdjustDateRange(std::string& s, std::string& e, Granularity g, AdjustType adj);

#endif  // DIARYTOOL_DATE_UTILS_HPP
